home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 February: Tool Chest / Apple Developer CD Series Tool Chest February 1996 (Apple Computer)(1996).iso / Sample Code / AOCE Sample Code / PowerTalk Access Modules / Sample PMSAM / PMSAM Framework / RoboSamTemplates / MoreTemplates.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-07-28  |  19.6 KB  |  754 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        MoreTemplates.c
  3.  
  4.     Contains:    xxx put contents here xxx
  5.  
  6.     Written by:    Steve Fisher, Eric Trehus, and Mike Cleron
  7.  
  8.     Copyright:    © 1992 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.          <3>     2/27/95    TMH        modify to compile withy metroworks
  13.          <2>     2/14/95    CL        remove warning for cplus
  14.          <1>     5/26/93    CL    first checked in
  15.         <26>      4/8/93    sf        add some targeted calls
  16.         <25>      4/5/93    jse        Add "GetRStringPropertyFromItemTarget()"
  17.         <24>      4/3/93    sf        fix GetTemplateFSSpec
  18.         <23>     3/31/93    sf        key chain stuff
  19.         <22>      2/9/93    sf        Ignore "markAsDirty"
  20.         <21>      2/7/93    sf        Add Busy call
  21.         <20>     1/22/93    jse        Add RequestSyncDSSpec()
  22.        <18+>     1/13/93    jse        Sync to new headers
  23.         <18>     12/3/92    jse        Fill in stubs for new DET callbacks
  24.         <17>    11/20/92    jse        Add another routine: GetTemplateNumberForSublistItem()
  25.         <16>    11/19/92    jse        Comment out unused parameters in stub routines
  26.         <15>    11/19/92    jse        Add new calls for new DET callbacks
  27.         <14>    10/13/92    sf        Add AboutToTalk
  28.         <13>     9/11/92    sf        add EnableDisable
  29.         <12>      9/8/92    sf        add SaveProperty
  30.         <11>     8/21/92    sf        add PropertyEditable calls
  31.         <10>     8/13/92    sf        add GetCustomViewBounds
  32.          <9>      8/6/92    sf        fix bug in GetNthSelectedItem
  33.          <8>     7/24/92    EMT        DE now allocates all handles, so simplified code.
  34.          <7>     7/23/92    EMT        Sync up to new header file
  35.          <6>      7/2/92    jse        Fix bug in SetPropertyChanged. Change kDETcmdDirtyProperty to
  36.                                     kDETcmdSetPropertyChanged
  37.          <5>     6/29/92    sf        add sync callback
  38.          <4>     6/29/92    sf        work around bug in Harry;s menuItemRString callback
  39.          <3>     6/25/92    sf        More MPW Police
  40.          <2>     6/24/92    sf        add OpenDSSpec
  41.          <1>     6/23/92    sf        first checked in
  42.  
  43.     To Do:
  44. */
  45.  
  46. #ifndef __MORETEMPLATES__
  47. #include "MoreTemplates.h"
  48. #endif
  49.  
  50. #ifndef __ERRORS__
  51. #include <Errors.h>
  52. #endif
  53.  
  54. #ifndef __RESOURCES__
  55. #include <Resources.h>
  56. #endif
  57.  
  58. // Asserts for debugging. They're only defined when DEBUG is defined
  59. #ifdef DEBUG
  60.  
  61. #define BLOCKASSERT(what)                { if (!(what)) Debugger(); }
  62. #define    ASSERT(what)                    do BLOCKASSERT(what) while(0)
  63.  
  64. #else
  65.  
  66. #define BLOCKASSERT(what)                {}
  67. #define    ASSERT(what)                    ((void)0)
  68.  
  69. #endif
  70.  
  71. pascal OSErr AddToMenu(DETCallBlockPtr callBlockPtr,
  72.                        short property,
  73.                        short parameter,
  74.                        RString *text,
  75.                        Boolean isSeparator)
  76. {
  77.     OSErr err;
  78.     DETCallBackBlock cbb;
  79.     
  80.     cbb.addMenu.reqFunction = kDETcmdAddMenu;
  81.     cbb.addMenu.property = property;
  82.     cbb.addMenu.target.selector = kDETSelf;
  83.     if (isSeparator)
  84.         {
  85.         text->dataLength = 1;
  86.         text->body[0] = '-';
  87.         }
  88.     cbb.addMenu.name = text;
  89.     cbb.addMenu.parameter = parameter;
  90.     cbb.addMenu.addAfter = -1;
  91.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  92. //    err = CallBackDET(callBlockPtr, &cbb);
  93.     
  94.     return err;
  95. }
  96.  
  97. // ### We're assuming that all the new values are in the same
  98. // position for Number, Binary, and RString properties
  99. pascal OSErr SetPropertyCommon(DETCallBlockPtr callBlockPtr,
  100.                                DETCallFunctions function,
  101.                                short property,
  102.                                void *newValue,
  103.                                long newValueSize,
  104.                                Boolean markAsChanged)
  105.     {
  106.     OSErr err;
  107.     DETCallBackBlock cbb;
  108.     
  109.     cbb.setPropertyBinary.reqFunction = (DETCallBackFunctions)function;
  110.     cbb.setPropertyBinary.property = property;
  111.     cbb.setPropertyBinary.target.selector = kDETSelf;
  112.     cbb.setPropertyBinary.newValue = (Ptr)newValue;
  113.     cbb.setPropertyBinary.newValueSize = newValueSize;
  114.  
  115.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  116. //    err = CallBackDET(callBlockPtr, &cbb);
  117.     
  118.     if ((err == noErr) && markAsChanged)
  119.         {
  120.         err = SetPropertyChanged(callBlockPtr, property, true);
  121.         }
  122.  
  123.     return err;
  124.     }
  125.  
  126. pascal OSErr SetNumProperty(DETCallBlockPtr callBlockPtr,
  127.                             short property,
  128.                             long value,
  129.                             Boolean markAsChanged)
  130. {
  131.     OSErr err;
  132.     
  133.     err = SetPropertyCommon(callBlockPtr, (DETCallFunctions)kDETcmdSetPropertyNumber, property, (void*) value, 0, markAsChanged);
  134.     
  135.     return err;
  136. }
  137.  
  138. pascal OSErr SetBinaryProperty(DETCallBlockPtr callBlockPtr,
  139.                                short property,
  140.                                Ptr newValue,
  141.                                long newValueSize,
  142.                                Boolean markAsChanged)
  143. {
  144.     OSErr err;
  145.  
  146.     err = SetPropertyCommon(callBlockPtr, (DETCallFunctions)kDETcmdSetPropertyBinary, property, newValue, newValueSize, markAsChanged);
  147.     
  148.     return err;
  149. }
  150.  
  151. pascal OSErr SetRStringProperty(DETCallBlockPtr callBlockPtr,
  152.                                 short property,
  153.                                 RString* newValue,
  154.                                 Boolean markAsChanged)
  155. {
  156.     OSErr err;
  157.  
  158.     err = SetPropertyCommon(callBlockPtr, (DETCallFunctions)kDETcmdSetPropertyRString, property, newValue, 0, markAsChanged);
  159.     
  160.     return err;
  161. }
  162.  
  163. pascal OSErr GetNumProperty(DETCallBlockPtr callBlockPtr, short property, long *value)
  164. {
  165.     OSErr err;
  166.     DETCallBackBlock cbb;
  167.     
  168.     cbb.getPropertyNumber.reqFunction = kDETcmdGetPropertyNumber;
  169.     cbb.getPropertyNumber.property = property;
  170.     cbb.getPropertyNumber.target.selector = kDETSelf;
  171.  
  172.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  173. //    err = CallBackDET(callBlockPtr, &cbb);
  174.     
  175.     *value = cbb.getPropertyNumber.propertyValue;
  176.     
  177.     return err;
  178. }
  179.  
  180. pascal OSErr GetBinaryProperty(DETCallBlockPtr callBlockPtr, short property, Handle *value)
  181. {
  182.     OSErr err;
  183.     DETCallBackBlock cbb;
  184.     
  185.     cbb.getPropertyBinary.reqFunction = kDETcmdGetPropertyBinary;
  186.     cbb.getPropertyBinary.property = property;
  187.     cbb.getPropertyBinary.target.selector = kDETSelf;
  188.  
  189.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  190. //    err = CallBackDET(callBlockPtr, &cbb);
  191.     *value = cbb.getPropertyBinary.propertyValue;
  192.     
  193.     return err;
  194. }
  195.  
  196. pascal OSErr GetRStringProperty(DETCallBlockPtr callBlockPtr,
  197.                                 short property,
  198.                                 RString ***str)
  199. {
  200.     OSErr err;
  201.     DETCallBackBlock cbb;
  202.     
  203.     cbb.getPropertyRString.reqFunction = kDETcmdGetPropertyRString;
  204.     cbb.getPropertyRString.property = property;
  205.     cbb.getPropertyRString.target.selector = kDETSelf;
  206.  
  207.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  208. //    err = CallBackDET(callBlockPtr, &cbb);
  209.     *str = cbb.getPropertyRString.propertyValue;
  210.     
  211.     return err;
  212. }
  213.  
  214. pascal OSErr GetBinaryPropertySize(DETCallBlockPtr callBlockPtr,
  215.                                    short property,
  216.                                    long *size)
  217. {
  218.     OSErr err;
  219.     DETCallBackBlock cbb;
  220.     
  221.     cbb.getPropertyBinarySize.reqFunction = kDETcmdGetPropertyBinarySize;
  222.     cbb.getPropertyBinarySize.property = property;
  223.     cbb.getPropertyBinarySize.target.selector = kDETSelf;
  224.  
  225.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  226. //    err = CallBackDET(callBlockPtr, &cbb);
  227.     *size = cbb.getPropertyBinarySize.propertyBinarySize;
  228.     
  229.     return err;
  230. }
  231.  
  232. pascal OSErr DirtyProperty(DETCallBlockPtr callBlockPtr, short property)
  233. {
  234.     OSErr err;
  235.     DETCallBackBlock cbb;
  236.     
  237.     cbb.dirtyProperty.reqFunction = kDETcmdDirtyProperty;
  238.     cbb.dirtyProperty.property = property;
  239.     cbb.dirtyProperty.target.selector = kDETSelf;
  240.  
  241.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  242. //    err = CallBackDET(callBlockPtr, &cbb);
  243.     
  244.     return err;
  245. }
  246.  
  247. pascal OSErr SetPropertyChanged(DETCallBlockPtr callBlockPtr,
  248.                                 short property,
  249.                                 Boolean propertyChanged)
  250. {
  251.     OSErr err;
  252.     DETCallBackBlock cbb;
  253.     
  254.     cbb.setPropertyChanged.reqFunction = kDETcmdSetPropertyChanged;
  255.     cbb.setPropertyChanged.property = property;
  256.     cbb.setPropertyChanged.target.selector = kDETSelf;
  257.     cbb.setPropertyChanged.propertyChanged = propertyChanged;
  258.     
  259.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  260. //    err = CallBackDET(callBlockPtr, &cbb);
  261.     
  262.     return err;
  263. }
  264.  
  265. pascal OSErr GetMyDSSpec(DETCallBlockPtr callBlockPtr,
  266.                          short *refNum,
  267.                          PackedDSSpec ***pDsSpec)
  268. {
  269.     OSErr err;
  270.     DETCallBackBlock cbb;
  271.     
  272.     cbb.getDSSpec.reqFunction = kDETcmdGetDSSpec;
  273.     cbb.getDSSpec.target.selector = kDETSelf;
  274.  
  275.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  276. //    err = CallBackDET(callBlockPtr, &cbb);
  277.     *pDsSpec = cbb.getDSSpec.dsSpec;
  278.     *refNum = cbb.getDSSpec.refNum;
  279.         
  280.     return err;
  281. }
  282.  
  283. pascal OSErr GetNumSelectedItems(DETCallBlockPtr callBlockPtr, long *num)
  284. {
  285.     OSErr err;
  286.     DETCallBackBlock cbb;
  287.     
  288.     cbb.selectedSublistCount.reqFunction = kDETcmdSelectedSublistCount;
  289.     cbb.selectedSublistCount.target.selector = kDETSelf;
  290.  
  291.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  292. //    err = CallBackDET(callBlockPtr, &cbb);
  293.     
  294.     *num = cbb.selectedSublistCount.count;
  295.         
  296.     return err;
  297. }
  298.  
  299. pascal OSErr GetNumSublistItems(DETCallBlockPtr callBlockPtr, long *num)
  300. {
  301.     OSErr err;
  302.     DETCallBackBlock cbb;
  303.     
  304.     cbb.sublistCount.reqFunction = kDETcmdSublistCount;
  305.     cbb.sublistCount.target.selector = kDETSelf;
  306.  
  307.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  308. //    err = CallBackDET(callBlockPtr, &cbb);
  309.     
  310.     *num = cbb.sublistCount.count;
  311.         
  312.     return err;
  313. }
  314.  
  315. pascal OSErr GetNthSelectedItem(DETCallBlockPtr callBlockPtr,
  316.                                 long itemNumber,
  317.                                 PackedDSSpec ***pDsSpec,
  318.                                 short *refNum)
  319. {
  320.     OSErr err;
  321.     DETCallBackBlock cbb;
  322.     
  323.     ASSERT(pDsSpec != nil);
  324.     cbb.getDSSpec.reqFunction = kDETcmdGetDSSpec;
  325.     cbb.getDSSpec.target.selector = kDETSelectedSublistItem;
  326.     cbb.getDSSpec.target.aspectName = nil;
  327.     cbb.getDSSpec.target.itemNumber = itemNumber;
  328.  
  329.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  330. //    err = CallBackDET(callBlockPtr, &cbb);
  331.     *pDsSpec = cbb.getDSSpec.dsSpec;
  332.     *refNum = cbb.getDSSpec.refNum;
  333.         
  334.     return err;
  335. }
  336.  
  337. pascal OSErr GetNthSublistItem(DETCallBlockPtr callBlockPtr,
  338.                                 long itemNumber,
  339.                                 PackedDSSpec ***pDsSpec,
  340.                                 short *refNum)
  341. {
  342.     OSErr err;
  343.     DETCallBackBlock cbb;
  344.     
  345.     ASSERT(pDsSpec != nil);
  346.     cbb.getDSSpec.reqFunction = kDETcmdGetDSSpec;
  347.     cbb.getDSSpec.target.selector = kDETSublistItem;
  348.     cbb.getDSSpec.target.aspectName = nil;
  349.     cbb.getDSSpec.target.itemNumber = itemNumber;
  350.  
  351.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  352. //    err = CallBackDET(callBlockPtr, &cbb);
  353.     *pDsSpec = cbb.getDSSpec.dsSpec;
  354.     *refNum = cbb.getDSSpec.refNum;
  355.         
  356.     return err;
  357. }
  358.  
  359. pascal OSErr OpenDSSpec(DETCallBlockPtr callBlockPtr, PackedDSSpec *dsSpec)
  360. {
  361.     OSErr err;
  362.     DETCallBackBlock cbb;
  363.     
  364.     cbb.openDSSpec.reqFunction = kDETcmdOpenDSSpec;
  365.     cbb.openDSSpec.dsSpec = dsSpec;
  366.  
  367.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  368. //    err = CallBackDET(callBlockPtr, &cbb);
  369.     
  370.     return err;
  371. }
  372.  
  373. pascal OSErr GetMenuItemRString(DETCallBlockPtr callBlockPtr,
  374.                                 short property,
  375.                                 long parameter,
  376.                                 RString ***str)
  377. {
  378.     OSErr err;
  379.     DETCallBackBlock cbb;
  380.     
  381.     cbb.menuItemRString.reqFunction = kDETcmdMenuItemRString;
  382.     cbb.menuItemRString.property = property;
  383.     cbb.menuItemRString.target.selector = kDETSelf;
  384.     cbb.menuItemRString.itemParameter = parameter;
  385.  
  386.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  387. //    err = CallBackDET(callBlockPtr, &cbb);
  388.     *str = cbb.menuItemRString.rString;
  389.     if (err == paramErr)
  390.     {
  391.         err = noErr;
  392.     }
  393.         
  394.     return err;
  395. }
  396.  
  397. pascal OSErr RequestSync(DETCallBlockPtr callBlockPtr)
  398.     {
  399.     OSErr err;
  400.     DETCallBackBlock cbb;
  401.     
  402.     cbb.requestSync.reqFunction = kDETcmdRequestSync;
  403.     cbb.requestSync.target.selector = kDETSelf;
  404.  
  405.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  406. //    err = CallBackDET(callBlockPtr, &cbb);
  407.     
  408.     return err;
  409.     }
  410.  
  411. pascal OSErr RequestSyncDSSpec(DETCallBlockPtr callBlockPtr, PackedDSSpec *dsSpec)
  412.     {
  413.     OSErr err;
  414.     DETCallBackBlock cbb;
  415.     
  416.     cbb.requestSync.reqFunction = kDETcmdRequestSync;
  417.     cbb.requestSync.target.selector = kDETDSSpec;
  418.     cbb.requestSync.target.dsSpec = dsSpec;
  419.  
  420.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  421. //    err = CallBackDET(callBlockPtr, &cbb);
  422.     
  423.     return err;
  424.     }
  425.  
  426. pascal OSErr GetCustomViewBounds(DETCallBlockPtr callBlockPtr, short property, Rect *bounds)
  427.     {
  428.     OSErr err;
  429.     DETCallBackBlock cbb;
  430.     
  431.     cbb.getCustomViewBounds.reqFunction = kDETcmdGetCustomViewBounds;
  432.     cbb.getCustomViewBounds.property = property;
  433.     cbb.getCustomViewBounds.target.selector = kDETSelf;
  434.  
  435.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  436. //    err = CallBackDET(callBlockPtr, &cbb);
  437.     
  438.     *bounds = cbb.getCustomViewBounds.bounds;
  439.     
  440.     return err;
  441.     }
  442.  
  443. pascal OSErr GetPropertyEditable(DETCallBlockPtr callBlockPtr, short property, Boolean *isEditable)
  444.     {
  445.     OSErr err;
  446.     DETCallBackBlock cbb;
  447.     
  448.     cbb.getPropertyEditable.reqFunction = kDETcmdGetPropertyEditable;
  449.     cbb.getPropertyEditable.property = property;
  450.     cbb.getPropertyEditable.target.selector = kDETSelf;
  451.  
  452.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  453. //    err = CallBackDET(callBlockPtr, &cbb);
  454.     
  455.     *isEditable = cbb.getPropertyEditable.propertyEditable;
  456.     
  457.     return err;
  458.     }
  459.  
  460. pascal OSErr SetPropertyEditable(DETCallBlockPtr callBlockPtr, short property, Boolean isEditable)
  461.     {
  462.     OSErr err;
  463.     DETCallBackBlock cbb;
  464.     
  465.     cbb.setPropertyEditable.reqFunction = kDETcmdSetPropertyEditable;
  466.     cbb.setPropertyEditable.property = property;
  467.     cbb.setPropertyEditable.target.selector = kDETSelf;
  468.     cbb.setPropertyEditable.propertyEditable = isEditable;
  469.  
  470.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  471. //    err = CallBackDET(callBlockPtr, &cbb);
  472.     
  473.     return err;
  474.     }
  475.  
  476. pascal OSErr SaveProperty(DETCallBlockPtr callBlockPtr, short property)
  477.     {
  478.     OSErr err;
  479.     DETCallBackBlock cbb;
  480.     
  481.     cbb.saveProperty.reqFunction = kDETcmdSaveProperty;
  482.     cbb.saveProperty.property = property;
  483.     cbb.saveProperty.target.selector = kDETSelf;
  484.  
  485.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  486. //    err = CallBackDET(callBlockPtr, &cbb);
  487.     
  488.     return err;
  489.     }
  490.  
  491. pascal OSErr GetTemplateFSSpec(DETCallBlockPtr callBlockPtr, DETTargetSelector selector, long itemNumber, FSSpec* spec)
  492.     {
  493.     OSErr err;
  494.     DETCallBackBlock cbb;
  495.     
  496.     cbb.getTemplateFSSpec.reqFunction = kDETcmdGetTemplateFSSpec;
  497.     cbb.getTemplateFSSpec.target.selector = selector;
  498.     cbb.getTemplateFSSpec.target.itemNumber = itemNumber;
  499.     cbb.getTemplateFSSpec.target.aspectName = nil;
  500.  
  501.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  502. //    err = CallBackDET(callBlockPtr, &cbb);
  503.     
  504.     BlockMove(&cbb.getTemplateFSSpec.fsSpec, spec, sizeof(FSSpec));
  505.     ASSERT(!MemError());
  506.     
  507.     return err;
  508.     }
  509.  
  510. pascal OSErr AboutToTalk(DETCallBlockPtr callBlockPtr)
  511.     {
  512.     OSErr err;
  513.     DETCallBackBlock cbb;
  514.     
  515.     cbb.aboutToTalk.reqFunction = kDETcmdAboutToTalk;
  516.  
  517.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  518. //    err = CallBackDET(callBlockPtr, &cbb);
  519.     
  520.     return err;
  521.     }
  522.  
  523. pascal OSErr GetNumPropertyFromItemTarget(DETCallBlockPtr callBlockPtr, short property, 
  524.                                         DETTargetSelector target, short itemNum, long *value)
  525. {
  526.     OSErr err;
  527.     DETCallBackBlock cbb;
  528.     
  529.     cbb.getPropertyNumber.reqFunction = kDETcmdGetPropertyNumber;
  530.     cbb.getPropertyNumber.property = property;
  531.     cbb.getPropertyNumber.target.selector = target;
  532.     cbb.getPropertyNumber.target.itemNumber = itemNum;
  533.     cbb.getPropertyNumber.target.aspectName = nil;
  534.  
  535.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  536. //    err = CallBackDET(callBlockPtr, &cbb);
  537.     
  538.     *value = cbb.getPropertyNumber.propertyValue;
  539.     
  540.     return err;
  541. }
  542.  
  543.  
  544. pascal OSErr GetRStringPropertyFromItemTarget(DETCallBlockPtr callBlockPtr, short property, 
  545.                                         DETTargetSelector target, short itemNum, RStringHandle *string)
  546. {
  547.     OSErr err;
  548.     DETCallBackBlock cbb;
  549.     
  550.     cbb.getPropertyNumber.reqFunction = kDETcmdGetPropertyRString;
  551.     cbb.getPropertyNumber.property = property;
  552.     cbb.getPropertyNumber.target.selector = target;
  553.     cbb.getPropertyNumber.target.itemNumber = itemNum;
  554.     cbb.getPropertyNumber.target.aspectName = nil;
  555.  
  556.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  557. //    err = CallBackDET(callBlockPtr, &cbb);
  558.     
  559.     if (err == noErr)
  560.         *string = cbb.getPropertyRString.propertyValue;
  561.     else
  562.         *string = nil;
  563.     
  564.     return err;
  565. }
  566.  
  567.  
  568. pascal OSErr SetNumPropertyForItemTarget(DETCallBlockPtr callBlockPtr, short property, 
  569.                                         DETTargetSelector target, short itemNum, long value)
  570. {
  571.     OSErr err;
  572.     DETCallBackBlock cbb;
  573.     
  574.     cbb.setPropertyNumber.reqFunction = kDETcmdSetPropertyNumber;
  575.     cbb.setPropertyNumber.property = property;
  576.     cbb.setPropertyNumber.target.selector = target;
  577.     cbb.setPropertyNumber.target.itemNumber = itemNum;
  578.     cbb.setPropertyNumber.target.aspectName = nil;
  579.     cbb.setPropertyNumber.newValue = value;
  580.  
  581.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  582. //    err = CallBackDET(callBlockPtr, &cbb);
  583.     
  584.     return err;
  585. }
  586.  
  587.  
  588. pascal OSErr CountTemplates(DETCallBlockPtr callBlockPtr, short* numTemplates)
  589. {
  590.     OSErr err;
  591.     DETCallBackBlock cbb;
  592.     
  593.     *numTemplates = 0;
  594.     cbb.templateCounts.reqFunction = kDETcmdTemplateCounts;
  595.  
  596.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  597. //    err = CallBackDET(callBlockPtr, &cbb);
  598.     
  599.     if (err == noErr)
  600.         *numTemplates = (short)cbb.templateCounts.aspectTemplateCount;
  601.         
  602.     return err;
  603. }
  604.  
  605. //--------------------------------------------------------------------------------------------------
  606.  
  607. pascal OSErr GetTemplateResource(DETCallBlockPtr callBlockPtr, 
  608.                                 short whichTemplate,
  609.                                 OSType resType,
  610.                                 short resID,
  611.                                 Handle* resource)
  612. {
  613.     OSErr err = noErr;
  614.     DETCallBackBlock cbb;
  615.  
  616.     *resource = nil;
  617.  
  618.     cbb.getResource.reqFunction = kDETcmdGetResource;
  619.     cbb.getResource.target.selector = kDETAspectTemplate;
  620.     cbb.getResource.target.itemNumber = whichTemplate;
  621.     cbb.getResource.target.aspectName = nil;
  622.     cbb.getResource.resourceType = resType;
  623.     cbb.getResource.property = resID;
  624.  
  625.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  626. //    err = CallBackDET(callBlockPtr, &cbb);
  627.     if (err == noErr)
  628.     {
  629.         *resource = cbb.getResource.theResource;
  630.         ASSERT(*resource);
  631.         
  632.         if (*resource == nil)
  633.             err = resNotFound;
  634.     }
  635.  
  636.     return err;
  637. }
  638.     
  639.  
  640. pascal OSErr GetTemplateNumberForSublistItem(DETCallBlockPtr callBlockPtr, 
  641.                                             long sublistItemNum, 
  642.                                             long *templateNumber)
  643. {
  644.     OSErr err = noErr;
  645.     
  646.     err = GetNumPropertyFromItemTarget(callBlockPtr, 
  647.                                         kDETAspectTemplateNumber,
  648.                                         kDETSublistItem,
  649.                                         (short)sublistItemNum,
  650.                                         templateNumber);
  651.     return err;
  652. }
  653.  
  654. //--------------------------------------------------------------------------------------------------
  655.  
  656. long WordAlignLong(long p);        // the compiler insists on a prototype
  657. long WordAlignLong(long p)
  658.     return ((p+1) & (~1)); 
  659. }            // align to next word
  660.  
  661. //--------------------------------------------------------------------------------------------------
  662.  
  663. pascal OSErr GetIndRString(short resID, short index, RStringPtr* rstring)
  664. {
  665.     OSErr err = noErr;
  666.     Handle resource = nil;
  667.     Ptr data;
  668.     RStringPtr found = nil;
  669.     RStringPtr result = nil;
  670.     long resSize;
  671.     short i;
  672.     Ptr farEnd;
  673.     unsigned short length;
  674.     short numStrings;
  675.     
  676.     resource = GetResource('rst#', resID);
  677.     ASSERT(resource);
  678.     if (resource == nil)
  679.         err = resNotFound;
  680.     else
  681.         err = ResError();
  682.         
  683.     if (err == noErr)
  684.     {
  685.         HLock(resource);
  686.         
  687.         numStrings = ((short*) *resource)[1];
  688.         if ((index <= 0) || (index > numStrings))
  689.             err = resNotFound;
  690.         
  691.         if (err == noErr)
  692.         {
  693.             data = *resource + sizeof(short) + sizeof(short);
  694.             found = (RStringPtr) data;
  695.             resSize = GetHandleSize(resource);
  696.             farEnd = data + resSize;
  697.         }
  698.         
  699.         for (i = 1; (i < index) && (err == noErr); i++)
  700.         {
  701.             if (data >= farEnd)
  702.                 err = resNotFound;
  703.             else
  704.             {
  705.                 data += (found->dataLength + sizeof(ProtoRString));
  706.                 data = (Ptr) WordAlignLong((long) data);
  707.                 found = (RStringPtr) data;
  708.             }
  709.         }
  710.         
  711.         if (err == noErr)
  712.         {
  713.             length = found->dataLength + sizeof(ProtoRString);
  714.             result = (RStringPtr) NewPtr(length);
  715.             ASSERT(result);
  716.             if (!result)
  717.                 err = MemError();
  718.         }
  719.         
  720.         if (err == noErr)
  721.         {
  722.             err = OCECopyRString(found, result, length);
  723.             ASSERT(err == noErr);
  724.         }
  725.         
  726.         if (err == noErr)
  727.             *rstring = result;
  728.         else
  729.             DisposePtr((Ptr) result);
  730.         
  731.         HUnlock(resource);
  732.     }
  733.     
  734.     if (resource != nil)
  735.         ReleaseResource(resource);
  736.     
  737.     return err;
  738. }
  739.  
  740. pascal OSErr TemplateBusy(DETCallBlockPtr callBlockPtr)
  741.     {
  742.     OSErr err;
  743.     DETCallBackBlock cbb;
  744.     
  745.     cbb.busy.reqFunction = kDETcmdBusy;
  746.  
  747.     err = CallDETCallBackProc(callBlockPtr->protoCall.callBack,callBlockPtr,&cbb);    
  748. //    err = CallBackDET(callBlockPtr, &cbb);
  749.     
  750.     return err;
  751.     }
  752.  
  753.